namespace Test.ConsoleProgram.Algorithm.Solution
{
    [TestDescription("算法: 0605. 种花问题")]
    public class No0605_CanPlaceFlowers : AbsBaseTestItem
    {
        /*
        假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
        给你一个整数数组  flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？能则返回 true ，不能则返回 false。

        示例 1：
        输入：flowerbed = [1,0,0,0,1], n = 1
        输出：true

        示例 2：
        输入：flowerbed = [1,0,0,0,1], n = 2
        输出：false

        提示：
            1 <= flowerbed.length <= 2 * 104
            flowerbed[i] 为 0 或 1
            flowerbed 中不存在相邻的两朵花
            0 <= n <= flowerbed.length
        */

        public override void OnTest()
        {
            Assert.TestExe(CanPlaceFlowers, new int[] { 1, 0, 0, 0, 1 }, 1, true);
            Assert.TestExe(CanPlaceFlowers, new int[] { 1, 0, 0, 0, 1 }, 2, false);
            Assert.TestExe(CanPlaceFlowers, new int[] { 1, 0, 0, 0, 0, 1 }, 2, false);
            Assert.TestExe(CanPlaceFlowers, new int[] { 1, 0, 0, 0, 0, 0, 1 }, 2, true);
            Assert.TestExe(CanPlaceFlowers, new int[] { 1, 0, 0, 0, 1, 0, 0 }, 2, true);
        }

        public bool CanPlaceFlowers(int[] flowerbed, int n)
        {
            int i = 0, len = flowerbed.Length;
            while (i < len)
            {
                if (flowerbed[i] == 1)
                {
                    i += 2;
                    continue;
                }
                if (i == len - 1)
                {
                    n--;
                    break;
                }
                if (flowerbed[i + 1] == 1)
                {
                    i += 3;
                }
                else
                {
                    i += 2;
                    n--;
                }
            }
            return n <= 0;
        }
    }
}
